package cn.sail.spring.aop.proxy;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class AnnotationAdvice {
    /**
     * 告诉spring aop 切面
     * 1，哪些类和方法是需要进行增强（切点）
     * 2，在方法得哪个位置进行增强（连接点）
     * 3，连接点对应的增强的方法指定
     */
    @Pointcut("execution(* cn.sail.spring.aop.service.impl.*ServiceImpl.*(..))")
    public void pointcut(){}

    //方法执行之前开启事务，打印日志
    @Before("AnnotationAdvice.pointcut()")
    public void before(){
        System.out.println("log start");
        System.out.println("开启事务");
    }
    @AfterReturning("AnnotationAdvice.pointcut()")
    //方法正常执行之后提交事务
    public void afterReturning(){
        System.out.println("提交事务");
    }
    @AfterThrowing("AnnotationAdvice.pointcut()")
    //方法异常执行之后回滚事务
    public void afterThrowing(){
        System.out.println("事务回滚");
    }
    @After("AnnotationAdvice.pointcut()")
    //方法执行完之后
    public void after(){
        System.out.println("log end");
    }
//    //环绕通知
//    @Around("AnnotationAdvice.pointcut()")
//    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
//        System.out.println("环绕通知之前");
//        //调用目标对象方法
//        Object result = joinPoint.proceed();
//        System.out.println("环绕通知之后");
//        return result;
//    }
}
